/**
 * classe que contindrà totes les funcionalitats dels objectes Usuaris,
 * estableix la connexió amb la classe DAO per obtenir/enviar els objectes
 * de tipus Usuari
 * @author Emili Antoni Moreno
 */
package edu.uoc.tfc.exuoc.controladors;

import edu.uoc.tfc.exuoc.config.Config;

import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import org.hibernate.HibernateException;

import edu.uoc.tfc.exuoc.model.Usuari;
import edu.uoc.tfc.exuoc.model.Grup;
import edu.uoc.tfc.exuoc.errors.NoExisteixException;
import edu.uoc.tfc.exuoc.errors.AfegirDAOException;
import edu.uoc.tfc.exuoc.errors.ExisteixException;
import edu.uoc.tfc.exuoc.errors.BuitException;

import edu.uoc.tfc.exuoc.utils.Eines;
import edu.uoc.tfc.exuoc.utils.seguretat.Encriptar;



public class GestorUsuaris implements InterfaceGestor {
    private static Integer numUsuaris=Config.valorNullInt;
    private UsuarisDAO dao;
    private GestorLogs  log;


    private static GestorUsuaris INSTANCE = null;
    private GestorUsuaris(){
        dao= new UsuarisDAO();
        log=GestorLogs .getLogger(this.getClass().getName());
        
    };

    // creador sincronizado para protegerse de posibles problemas  multi-hilo
    // otra prueba para evitar instantiación múltiple
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new GestorUsuaris();
        }

    }
    public static GestorUsuaris getInstance() {
        if (INSTANCE == null) createInstance();
            return INSTANCE;
    }




    //Obre una connexió amb el gestor genèric de la persistència DAO
    @Override
    public void openGestor() throws HibernateException{
        if (this.dao==null) this.dao= new UsuarisDAO();
    }
    // Mètode que tancarà la sessió oberta un cop ja no calgui
    @Override
    public void  tancar() {
        try{
            dao.tancarConnexio();
            dao=null;
        }catch(HibernateException e){
            log.error("GU:tancar:Hi ha hagut un error realitzant el tancament "
                    +"amb la base de dades ", e.getLocalizedMessage());
        }catch (NullPointerException e){
            this.log.info("GU:tancar:Gestor d'usuaris ja tancat");
        }

    }

    @Override
    public GestorLogs  getLog() {
        return log;
    }

    @Override
    public void setLog(GestorLogs  log) {
        this.log = log;
    }


    /**
     * Es busca un usuari per login
     * @param usu
     * @return cert si es troba
     */
    public boolean existeix(Usuari usu){
        boolean existeix=false;
        Usuari us1=new Usuari();
        openGestor();
        try {

            Long id=usu.getId();
            if (id!=Config.valorNull){
                us1.setId(id);
                us1=dao.consulta("login", usu.getLogin());
                if (us1!=null ){
                    Eines.escriu("Usu trobat. id:"+us1.getId()+" login:"
                            +us1.getLogin());
                    existeix=true;
                }
            }

        }catch (HibernateException e){
            log.error("GU:Existeix:Nou Usuari login:"+usu.getLogin()
                    +".Possiblement login repetit."+e.getLocalizedMessage());

        }catch (BuitException e){
            log.error("GU:Existeix:Valor buit. No s'ha trobat l`usuari. "
                    +e.getLocalizedMessage());

        }catch (UnsupportedEncodingException e){
            log.error("GU:Existeix:Error en la cadena de cerca where.Usuari:"
                    +usu.getLogin()+". "+e.getLocalizedMessage());

        }catch (NullPointerException e){
            log.error("GU:Existeix:possiblement l'usuari o el seu l'id sigui null."
                    +e.getLocalizedMessage());
        }

        us1=null;
        return existeix;
    }

    /**
     *  Afegeix un usuari nou, passat per paràmetre, al sistema
     * @param nou
     * @return Retorna un valor negatiu si no s'ha pogut realitzar l'operació
     * @throws HibernateException
     * @throws AfegirDAOException
     * @throws BuitException
     */
    public Long afegir(Usuari nou) throws HibernateException, AfegirDAOException,
                        BuitException,NoExisteixException,ExisteixException{
        Long idUsu=Config.valorNull;
        openGestor();
        
        //Es comprova que l'usuari no existeix
        if ( ! this.existeix(nou)){
            try {
                Encriptar en= new Encriptar();
                //S'encripta la ppas
                nou.setContrasenya(en.md5(nou.getContrasenya()));
                nou.getGrup().addUsuari(nou);
                //Emili 05-01-2012:idUsu=this.dao.afegir(nou);
                // Eines.escriu(" idNou: "+idUsu);


                //Es busca el grup segons l'id entregat
                //GestorGrups gg=new GestorGrups();
                //Grup gp=(Grup)gg.llegir(nou.getGrup().getId());
                //S'afegeix l'usuari al grup trobat
                //gp.addUsuari(nou);
                //S'afegeix l'usuari a
                //nou.setGrup(gp);

                this.getLog().info("Usuari Nou : "+nou.toString());

                idUsu=dao.afegir(nou);
                if (idUsu.equals(Config.valorNull) )
                    throw new AfegirDAOException("GU:Afegir:No s'ha afegit l'usuari nou");
                //Actualitzem la llista d'Usuaris
                this.numUsuaris(1);
            }catch (HibernateException e){
                this.getLog().error("GU:Afegir: No s'ha pogut afegir l'usuari id:"
                        +nou.toString()+". "+e.getLocalizedMessage());
                throw new AfegirDAOException("GU:Afegir:No s'ha afegit l'usuari nou");
            }catch (BuitException e){
                this.getLog().error("GU:Afegir:Tenim un valor buit per l'usuari id:"+nou.toString());
                throw e ;
            }catch (NullPointerException e){
               this.getLog().error("GU:Afegir:S'ha trobat un valor null.");
               throw e;
            }/*catch (NoExisteixException e){
               this.getLog().error("GU:Afegir:L'id entregat del grup no correspon a cap grup."+e.getLocalizedMessage());
               throw e;
            }*//*catch (ExisteixException e){
                this.getLog().error("Afegir:Error de retorn de l'afegir."+e.getLocalizedMessage());
            
            }*/

        }else{

            log.error("GU:Afegir: l`usuari amb login:"
                    +nou.getLogin()+" ja existeix");


            //throw new ExisteixException("login repetit. Login:"
            //        +nou.getLogin());

        }

        return idUsu;
    }


    public Long eliminar(Usuari usuari) throws HibernateException, BuitException {
        Long id=Config.valorNull;
        GestorGrups gg= new  GestorGrups();
        Grup grup=null;
        try {
            
            grup=usuari.getGrup();
            id=usuari.getId();
            //Eliminem l'usuari de la base de dades
            //actualitzant la relació Grup<-Usuaris
            if (grup.getUsuaris().remove(usuari)) id=-1L;
            if (gg.modificar(grup)!=0L) id=-11L;

            //dao.eliminar(usuari);
            //S'actualitza la llista d`usuaris
            this.numUsuaris(-1);
        }catch (HibernateException e){
            id=-2L;
            log.error("No s'ha pogut eliminar l'usuari id:{}", Long.toString(usuari.getId()));
        }catch (BuitException e){
            id=-21L;
            log.error("No s'ha pogut eliminar l'usuari id:{}", Long.toString(usuari.getId()));
        }catch (NullPointerException e){
            id=-22L;
            log.error("Usuari inexsitent. No s'ha pogut eliminar id:{}", Long.toString(usuari.getId()));
        }
        return id;
    }

   /**
    *
    * @param actual
    * @return num d'error
    * @throws HibernateException
    * @throws BuitException
    */
    public Usuari modificar(Usuari actual) throws HibernateException, BuitException {
        Usuari usuari=new Usuari();
        usuari.setId(Config.valorNull);

        openGestor();
        try {
            dao.modificar(actual);
            usuari=actual;
        }catch (HibernateException e){
            String[] cadError={actual.getNom(),String.valueOf(actual.getId())};
            log.error("No s'ha pogut modificar l'usuari :{}s. /n Amb id:{}", cadError);
            //throw e;
        }catch (BuitException e){
            String[] cadError={actual.getNom(),String.valueOf(actual.getId())};
            log.error("No s'ha pogut modificar l'usuari :{}s. /n Amb id:{}", cadError);
            //throw e;
        }catch (NullPointerException e){
            String[] cadError={actual.getNom(),String.valueOf(actual.getId())};
            log.error("Valor null. No s'ha pogut modificar l'usuari :{}s. /n Amb id:{}", cadError);
        }
        return usuari;
    }

    /**
     * S'obté un usuari per login
     * @param login
     * @return usuari si trobat, cas contrari new Usuari();
     */
    public Usuari llegir(String loginStr)  {
        Usuari    usu=new Usuari();
        Usuari usuari=null;
        usu.setLogin(Config.valorNullStr);
        usu.setId(Config.valorNull);
        openGestor();

        try {
            usuari=dao.consulta("login", loginStr);
            if (usuari!=null) usu=usuari;
            
        }catch(NullPointerException e){
            log.error("GU:Llegir:Valor llegit o paràmetre són nulls."+e.getMessage());
        }/*catch(BuitException e){
            log.error("Valor buit per l'usuari amb id: "+id);
        }*/catch(HibernateException e){
            log.error("GU:Llegir:No s'ha llegit l'usuari amb login: "+loginStr+"."
                    +e.getLocalizedMessage());
        }catch(BuitException e){
            log.error("GU:Llegir:Valor llegit buit per l'usuari amb login: "+loginStr+"."
                    +e.getMessage());
        }catch(UnsupportedEncodingException e){
            log.error("GU:Llegir:Cadena de cerca errònia pel login: "+loginStr+"."
                    +e.getMessage());
        }

        //Eines.escriu("Quin tenim ? "+usu.getLogin());
        return usu;
    }

    public Usuari llegir(Long id) throws NoExisteixException {
        Usuari    usu=new Usuari();
        Usuari usuari=null;
        usu.setLogin(Config.valorNullStr);
        usu.setId(Config.valorNull);

        openGestor();
        try {
            usuari=this.llegir(Usuari.class, id);
            if (usuari.getLogin().equals(null)){
                throw new NoExisteixException("usuari inexistent, id:"+id);
            }else {
                usu=usuari;
            }
        }catch(NullPointerException e){
            log.error("Valor llegit null per l'usuari amb id: "+id,e.getMessage());
        }/*catch(BuitException e){
            log.error("Valor buit per l'usuari amb id: "+id);
        }*/catch(HibernateException e){
            log.error("No s'ha llegit l'usuari amb id: "+id,e.getLocalizedMessage());

        }
        //Eines.escriu("Quin tenim ? "+usu.getLogin());
        return usu;
    }

    public Usuari llegir(Class classe,Long id) {
        //throws HibernateException, NoExisteixException, BuitException {
        Usuari  usu=null;

        openGestor();
        try {
            usu=dao.consulta(classe, id);
        }catch (BuitException e){
            log.error("GU:Llegir: No s'ha llegit l'usuari amb id: "+id);
        }catch (NullPointerException e){
            log.error("GU:Llegir: Valors nulls. "+e.getLocalizedMessage());
        }
/*        if (usu==null){
            throw new NoExisteixException("No s'ha trobat l'usuari buscat amb id: "+id.toString(),this.getClass());
        }*/
       
        return usu;
    }

    /**
     * Recupera l'usuari amb login indicat i després compara la contrasenya
     * indicada amb la recuperada.
     * @param _login
     * @param _contrasenya
     * @return Retorna l'usuari si la contrasenya és correcta.
     */
    public Usuari autenticar(String _login, String _contrasenya)   {
        Usuari usu=null;
        
        openGestor();
        try {
            usu = dao.consulta("login", _login.trim());
            //Si la paraula de pas no concorda amb la passada es retorna un null
            if (!verificarContrasenya(usu,_contrasenya)){
                usu=null;
            }
        } catch (HibernateException ex) {
            log.error("Error d'accés a les dades :",this.getClass().getCanonicalName());
        } catch (BuitException ex) {
            //throw new NoExisteixException("l'identificador d'suari no és correcte: "+_login,this.getClass());
            log.error("l'identificador d'usuari no és correcte: "+_login);
        }
         catch (UnsupportedEncodingException ex) {
            //throw new NoExisteixException("l'identificador d'suari no és correcte: "+_login,this.getClass());
            log.error("Error de paràmetres per l'usuari: "+_login);
        }catch (NullPointerException ex) {
            log.error("Algun paràmetre null.{}",ex.getLocalizedMessage());
        }
        if (usu==null){
            //throw new NoExisteixException("l'identificador d'suari no és correcte: "+_login,this.getClass());
            log.error("l'identificador d'usuari no és correcte: "+_login);
        }

        return usu;
    }

    /**
     * Retorna cert si s'ha indicat correctament la contrasenya amb el sistema
     * d'encripatació que s'utilitza l'aplicatiu.
     * @param usu
     * @param ppas
     * @return
     */
    public Boolean verificarContrasenya(Usuari usu, String ppas){
        Boolean valid=true;
        Encriptar e=new Encriptar();

        //if (e.md5(ppas)!=usu.getContrasenya()) valid=false;

        if (!e.md5(ppas).equals(usu.getContrasenya())) valid=false;

        return valid;

    }


    /**
     * Retorna la llista dels usuaris completa
     * @return
     * @throws HibernateException
     * @throws BuitException
     */
    @Override
    public Iterator<Usuari> llistat() throws HibernateException, BuitException {
        Iterator<Usuari> it;
        openGestor();
        try {
           /* if (dao==null) {
                this.dao=new UsuarisDAO();
                Eines.escriu("DA ÉS NULLLLLLLLLLLLLLLLLLLLLLLLLL");
            }*/
            //Eines.escriu("Quants:"+this.dao.quants());
            it=(Iterator<Usuari>)dao.llista();
        }catch(NullPointerException e){
            getLog().error("GU:Llistat():Llista Nul.la");
            it=null;
        }
        if (it==null){
            getLog().error("GU:llistat(): Llista Nulla");
        }
        return it;
    }

    /**
     * Retorna la llista dels usuaris compresa entre ini i fi
     * @param ini
     * @param fi
     * @return
     * @throws HibernateException
     * @throws BuitException
     */
    @Override
    public Iterator<Usuari> llistat(int ini, int fi)throws HibernateException, BuitException {
        Iterator<Usuari> llista=null;
        List<Usuari> llistaAcotada=new ArrayList<Usuari>();
        Usuari usu=null;
        //getLog().info("GU:Llistat:");
        llista=this.llistat();
        for (int i=0; (i<=fi)&&(llista.hasNext());i++){
            //getLog().info("GU:Llistat: dintre for:");
            usu=llista.next();
            if (ini<=i ) {
                llistaAcotada.add(usu);
            }

        }
        return llistaAcotada.iterator();
    }

    /*TODO: 17-12-2011
     * Si cal cas contrari es deixa sense implementar, es deixa per l'interficie
     * De moment retorna la llista sencera
     */
    @Override
    public Iterator<Usuari> llistat(String camp,String pernom, int ini,int fi)
            throws HibernateException ,BuitException{
        Iterator<Usuari> llistaAcotada=null;
        llistaAcotada=(Iterator<Usuari>)this.llistat();
        return llistaAcotada;
    }

    public Iterator<Usuari> llistat(String ordre, int quants )
                    throws HibernateException, BuitException {

        Iterator<Usuari> llistaAcotada;

        openGestor();
        llistaAcotada=dao.llista(ordre, quants);

        return llistaAcotada;
    }

        /**
     *
     * @return Nombre d'usuaris del sistema
     */
    @Override
    public int num() throws HibernateException,BuitException{
        int nUsuaris=0;

        openGestor();
        if (GestorUsuaris.numUsuaris.equals(Config.valorNullInt) ||
                (GestorUsuaris.numUsuaris <0)) {
            //Obtenim el valor d'ítems
            try{
                nUsuaris=dao.quants();
                if (nUsuaris>0)  GestorUsuaris.numUsuaris=nUsuaris;
                else throw new BuitException("Classe Contenidor, count="+String.valueOf(nUsuaris));
            }catch (HibernateException e){
                    log.error("Falla la connexió amb la bddd. Error en conèixer el nombre d`usuaris");
                    throw e ;
            }catch (BuitException e){
                    log.error("No hi ha usuaris");
                    throw e ;
            }
        }
        return GestorUsuaris.numUsuaris;
    }
    /**
     * Implemetació no realitzada ja que de moment no cal, ens obliga l'interfície
     * de moment retorna el nombre total
     * @param nomCercat
     * @return
     * @throws HibernateException
     * @throws BuitException
     */
    @Override
     public int num(String nomCercat) throws HibernateException,BuitException{
         return this.num();
     }

    /**
     * Augmenta el nombre d'usuaris del sistema, per una suposada nova persistència
     * @param augment
     * @return
     * @throws HibernateException
     * @throws BuitException
     */
    public int numUsuaris(Integer augment) throws HibernateException,BuitException{
        Integer nouValor=this.num();

        if (augment.equals(1)) nouValor++;
        else if (augment.equals(-1)) nouValor--;

        GestorUsuaris.numUsuaris=nouValor;

        return GestorUsuaris.numUsuaris;
    }

 


    /*****************************************************
     *
     * TESTS
     * 
     *****************************************************/
    private void testNumUsuaris(GestorUsuaris gu){
        try {
            Eines.escriu("Num Usuaris: "+gu.num());        } catch (HibernateException ex) {
            log.error("Error en obtenir el nombre d`usuaris.", ex.getLocalizedMessage());
        } catch (BuitException ex) {
            log.error("nombre d`usuaris incorrecte: ", ex.getLocalizedMessage());
        }

    }
    private void testllistaUsuaris(GestorUsuaris gu){

        try {
            int i=1;
            Iterator<Usuari> it=gu.llistat();
            Eines.escriu();
            Eines.escriu("Llista d'usuaris:");
            while (it.hasNext()){
                Usuari c=it.next();
                Eines.escriu(i+++" :"+c);
            }

        } catch (HibernateException ex) {
            log.error("Error en obtenir la llista d'usuaris.", ex.getLocalizedMessage());
        } catch (BuitException ex) {
            log.error("llista buida de usuaris: ", ex.getLocalizedMessage());
        }

    }
    private void testAutenticar(){

        try {
            Usuari usu = this.llegir(3L);
            Eines.escriu("Login a autenticar:"+usu.getLogin());
            Usuari usuari=this.autenticar(usu.getLogin().toString(), "123456");
            if (usuari==null)
                Eines.escriu("No s'ha autenticat correctament");
            else Eines.escriu("Autenticació correcta");

        Eines.escriu("Data alta de l'usuari "+usu.getNom()+":"+usuari.getDataalta().toString());
        } catch (NoExisteixException ex) {
            log.error("L'usuari no existeix: ", ex.getLocalizedMessage());
        }catch (NullPointerException ex) {
            log.error("ha fallat l'autenticació: ", ex.getLocalizedMessage());
        }
    }


    private void testModificarGrup(){
        Grup gp= new Grup();
        Usuari usu1, usu2,usu3= new Usuari();
        List<Usuari> llu= new ArrayList<Usuari>();
        String atzar = Integer.toString(new java.util.Random().nextInt());

        Eines.escriu("valor random:"+atzar);
        usu1= new Usuari(atzar.substring(0, 7), "marques1", "c/mat", "972-404040",new Date(),atzar.substring(0, 7), "123456", true, new java.util.Date(), null);
        usu2= new Usuari(atzar.substring(0, 7), "marques2", "c/mat", "972-404040",new Date(),atzar.substring(0, 7), "123456", true, new java.util.Date(), null);
        usu3= new Usuari(atzar.substring(0, 7), "marques3", "c/mat", "972-404040",new Date(),atzar.substring(0, 7), "123456", true, new java.util.Date(), null);
        llu.add(usu1);
        llu.add(usu2);
        llu.add(usu3);

        gp.setDatapub(new java.util.Date());
        gp.setId(1L);
        gp.setUsuaris(llu);
        gp.setNom("prova");

        Eines.escriu("Grup: "+gp);
        Eines.escriu("Llista del grup:"+gp.getUsuaris());
        gp.getUsuaris().remove(usu1);
        Eines.escriu("Llista del grup:"+gp.getUsuaris());

    }
    private void testCicleVidaUsuari(){

        GestorUsuaris gu=new GestorUsuaris();
        GestorGrups gg=new GestorGrups();
        //Usuari usuari=null;
        //Grup grup=null;
        Long id=Config.valorNull;

        try {
            //Afegir un usuari
            Grup gp1=(Grup)gg.llegir(Config.GESTOR);
            //es crea un usuari i se l'assigna el grup GESTOR
            Usuari usu1= new Usuari("xipote6", "marques", "c/mat", "972-404040",new Date(),"xipote6", "123456", true, new java.util.Date(), null);
            //s'afegeix l'usuari al grup
            Eines.escriu("0.- Num Usuaris: "+gu.num());
            Eines.escriu("S'afegeix l'usuari: "+usu1);
            //19-12:gp1.addUsuari(usu1);
            usu1.setGrup(gp1);

            //es fa la persistència
            //gg.modificar(gp1);
            id=gu.afegir(usu1);
            Eines.escriu("1.- Num Usuaris: "+gu.num());
            //usu1=null;
            gp1=null;
            //gu.tancar();
            Eines.escriu("2.- Num Usuaris: "+gu.num());
            //Llegim i fem canvis  sobre l'usuari creat abans
            //gu.openGestor();
            Usuari usu2=(Usuari)gu.llegir(id);
            Eines.escriu("Usuari amb id:"+usu2.getId()+" Actiu ? "+usu2.getActiu());
            usu2.setActiu(false);
            if (gu.modificar(usu2).getId().equals(Config.valorNull))
                    Eines.escriu("No s'han realitzat els canvis");
               
            usu2=null;
            Eines.escriu("3.- Num Usuaris: "+gu.num());
            //Comprovem els canvis
            usu2=(Usuari)gu.llegir(id);
            Eines.escriu("Re-llegim usuari amb id:"+usu2.getId()+". Actiu ? "+usu2.getActiu());
            usu2=null;
            gu.tancar();
            Eines.escriu("4.- Num Usuaris: "+gu.num());

            //Es prova de tornar-lo a afegir
            gu.openGestor();
            Eines.escriu("Es torna a afegir l'usuari: "+usu1.getLogin()+", "
                    +usu1.getGrup().getNom());
            
            id=gu.afegir(usu1);
            if (id.equals(Config.valorNull)){
                Eines.escriu("Usuari no afegit. repetit ?");
            }

            gu.tancar();
            //Eliminem usuari
            gu.openGestor();
            //Usuari usu3=gu.llegir(id);
            Usuari usu3=this.llegir( usu1.getLogin());
            Eines.escriu("Usuari a eliminar: "+usu3);
            gu.eliminar(usu3);
            Eines.escriu();
            usu3=null;
            //gp3=null;
            Eines.escriu("5.- Num Usuaris: "+gu.num());
            gu.tancar();
            Eines.escriu("6.- Num Usuaris: "+gu.num());
            //Comprovem que s'ha eliminat
            gu.openGestor();
            /*Usuari usu4=gu.llegir(id);
            if (usu4.getLogin().equals(Config.valorNullStr)||
                usu4.getId().equals(Config.valorNull) )*/
            
            Usuari usu4=new Usuari();
            usu4.setLogin("xipote6");
            if (!this.existeix(usu4))
                Eines.escriu("Confirmació:Usuari Eliminat");
            else Eines.escriu("ERROR: Usuari no eliminat "+usu4.getLogin());

        } catch (HibernateException ex) {
            Logger.getLogger(GestorUsuaris.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BuitException ex) {
            Logger.getLogger(GestorUsuaris.class.getName()).log(Level.SEVERE, null, ex);
        }catch (NoExisteixException ex) {
            Logger.getLogger(GestorUsuaris.class.getName()).log(Level.SEVERE, null, ex);
        }catch (AfegirDAOException ex) {
            Logger.getLogger(GestorUsuaris.class.getName()).log(Level.SEVERE, null, ex);
        }catch (NullPointerException ex) {
            Logger.getLogger(GestorUsuaris.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex);
        }
        catch (ExisteixException ex) {
            //Logger.getLogger(GestorUsuaris.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex);
            log.info("GU:Existeix: Valor ja existeix.");

        }
        finally{
                gg.tancar();
                gg=null;

               gu.tancar();
               gu=null;

        }

    }

  /**************************************
   * MAIN
   **************************************/
   public static void main(String args[]){
        GestorLogs  log= GestorLogs .getLogger(GestorUsuaris.class.getCanonicalName());
        GestorUsuaris gu=new GestorUsuaris();
       // GestorGrups gg=new GestorGrups();

        //gu.testNumUsuaris(gu);
       // gu.testModificarGrup();
        gu.testllistaUsuaris(gu);
        gu.testCicleVidaUsuari();


        //Eines.escriu("abans, d'inicialitzar num Usus :"+GestorUsuaris.numUsuaris);

        //gu.testAutenticar();

       
    gu.tancar();

    }



}
